package br.com.sgc.helper;

public class ValidadorCNPJCPFUtil {

	public static boolean isCPFValido(String cpf) {
		if ((cpf == null) || cpf.trim().equals("")) {
			return false;
		}

		if (!(cpf instanceof String)) {
			return false;
		}

		return validaDigitoVerificador((String) cpf);
	}
	
	public static boolean isCnpjValido(String cnpj) {
		if ((cnpj == null) || cnpj.trim().equals("")) {
			return false;
		}
		
		if (!cnpj.substring(0, 1).equals("")) {
			try {
				cnpj = cnpj.replace('.', ' ');// onde há ponto coloca espaço
				cnpj = cnpj.replace('/', ' ');// onde há barra coloca espaço
				cnpj = cnpj.replace('-', ' ');// onde há traço coloca espaço
				cnpj = cnpj.replaceAll(" ", "");// retira espaço
				int soma = 0, dig;
				String cnpj_calc = cnpj.substring(0, 12);

				if (cnpj.length() != 14) {
					return false;
				}
				char[] chr_cnpj = cnpj.toCharArray();
				/* Primeira parte */
				for (int i = 0; i < 4; i++) {
					if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
						soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
					}
				}
				for (int i = 0; i < 8; i++) {
					if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
						soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
					}
				}
				dig = 11 - (soma % 11);
				cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer
						.toString(dig);
				/* Segunda parte */
				soma = 0;
				for (int i = 0; i < 5; i++) {
					if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
						soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
					}
				}
				for (int i = 0; i < 8; i++) {
					if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
						soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
					}
				}
				dig = 11 - (soma % 11);
				cnpj_calc += (dig == 10 || dig == 11) ? "0" : Integer
						.toString(dig);
				return cnpj.equals(cnpj_calc);
			} catch (Exception e) {
				return false;
			}
		} else {
			return false;
		}
	}

	private static boolean validaDigitoVerificador(String cpf) {
		if ((cpf.length() == 11) && (!temTodosElementosIguais(cpf))) {
			int d1, d2;
			int digito1, digito2, resto;
			int digitoCPF;
			String dvResult;
			d1 = 0;
			d2 = 0;
			digito1 = 0;
			digito2 = 0;
			resto = 0;

			for (int i = 1; i < cpf.length() - 1; i++) {
				digitoCPF = Integer.valueOf(cpf.substring(i - 1, i)).intValue();
				d1 += (11 - i) * digitoCPF;
				d2 += (12 - i) * digitoCPF;
			}

			resto = (d1 % 11);

			if (resto < 2) {
				digito1 = 0;
			} else {
				digito1 = 11 - resto;
			}

			d2 += 2 * digito1;

			resto = (d2 % 11);

			if (resto < 2) {
				digito2 = 0;
			} else {
				digito2 = 11 - resto;
			}

			String digitoVerificador = cpf.substring(cpf.length() - 2,
					cpf.length());
			dvResult = String.valueOf(digito1) + String.valueOf(digito2);

			return digitoVerificador.equals(dvResult);
		}

		return false;
	}

	private static boolean temTodosElementosIguais(String cpf) {
		for (int i = 1; i < cpf.length(); i++) {
			if (cpf.charAt(i) != cpf.charAt(i - 1)) {
				return false;
			}
		}
		return true;
	}

}
